Optimeeri TypeScripti kompileerimiskiirust tõestatud tehnikatega. Õpi, kuidas parandada oma arendustöövoogu ja vähendada ehitusaegu kiiremate iteratsioonide jaoks.
TypeScripti jõudlus: Kompileerimiskiiruse optimeerimise tehnikad
TypeScript, JavaScripti laiendus, pakub staatilist tüpiseerimist, paremat koodi organiseerimist ja täiustatud hooldatavust. Kuid projektide kasvu ja keerukuse suurenemisel võib TypeScripti kompileerimine muutuda oluliseks kitsaskohaks arendustöövoos. Aeglased kompileerimisajad võivad viia arendaja tootlikkuse languseni, suurenenud pettumuseni ja pikemate iteratsioonitsükliteni. See artikkel süveneb tõhusatesse tehnikatesse TypeScripti kompileerimiskiiruse optimeerimiseks, tagades sujuvama ja tõhusama arenduskogemuse.
Kompileerimisprotsessi mõistmine
Enne optimeerimistehnikatesse süvenemist on oluline mõista TypeScripti kompileerimisprotsessi. TypeScripti kompilaator (tsc) loeb TypeScripti faile, teostab tüübikontrolli ja väljastab JavaScripti faile. Kompileerimiskiirust mõjutavad mitmed tegurid, sealhulgas:
- Projekti suurus: TypeScripti failide ja koodiridade arv mõjutab otseselt kompileerimisaega.
- Tüüpide keerukus: Keerulised tüübidefinitsioonid, geneerilised tüübid ja liittüübid suurendavad kompilaatori töökoormust.
- Moodulite lahendamine: Moodulisõltuvuste leidmise ja lahendamise protsess võib olla aeganõudev, eriti suurtes projektides keerukate moodulistruktuuridega.
- tsconfig.json konfiguratsioon: Failis
tsconfig.jsonmääratud kompilaatori valikud mõjutavad oluliselt kompileerimiskiirust ja väljundit. - Riistvara: Ka CPU kiirus, RAM ja ketta I/O jõudlus mängivad rolli.
Optimeerimistehnikad
Siin on mitmeid tehnikaid TypeScripti kompileerimiskiiruse optimeerimiseks:
1. Inkrementaalne kompileerimine
Inkrementaalne kompileerimine on üks tõhusamaid viise kompileerimiskiiruse parandamiseks. Kui see on lubatud, puhverdab kompilaator teavet projekti struktuuri ja sõltuvuste kohta. Järgmised kompileerimised töötlevad ainult faile, mis on alates viimasest kompileerimisest muutunud. Inkrementaalse kompileerimise lubamiseks seadke oma tsconfig.json failis valik incremental väärtusele true:
{
"compilerOptions": {
"incremental": true,
"tsBuildInfoFile": ".tsbuildinfo" // Valikuline, kuid soovitatav
}
}
Valik tsBuildInfoFile määrab inkrementaalse ehitusteabe faili asukoha. Hea tava on lisada see fail oma .gitignore'i, et vältida selle jälgimist Git'i poolt.
Näide: Kujutage ette suurt e-kaubanduse rakendust sadade TypeScripti failidega. Ilma inkrementaalse kompileerimiseta võib täielik ehitus võtta mitu minutit. Inkrementaalse kompileerimise lubamisel võivad järgnevad ehitused pärast väiksemaid koodimuudatusi võtta vaid paar sekundit.
2. Projekti viited
Suurte projektide puhul kaaluge nende jagamist väiksemateks, hallatavamateks mooduliteks või teekideks. TypeScripti projektiviidete funktsioon võimaldab teil struktureerida oma koodibaasi omavahel ühendatud projektide kogumina. See võimaldab kompilaatoril ehitada projekte paralleelselt ja inkrementaalselt, vähendades veelgi ehitusaegu.
Projektiviidete kasutamiseks looge igale alamprojektile tsconfig.json fail. Peaprojekti tsconfig.json-i lisage massiiv references, mis loetleb alamprojekti tsconfig.json failide teed:
{
"compilerOptions": {
"composite": true, // Nõutud projektiviidete jaoks
"declaration": true, // Nõutud projektiviidete jaoks
"declarationMap": true,
"incremental": true,
"tsBuildInfoFile": ".tsbuildinfo"
},
"files": [], // Välistage failid selgesõnaliselt; kaasake kasutades `references`
"references": [
{ "path": "./core" },
{ "path": "./ui" },
{ "path": "./api" }
]
}
Iga viidatud projekti tsconfig.json peab sisaldama composite: true ja declaration: true. See võimaldab TypeScriptil genereerida deklaratsioonifaile (.d.ts) iga alamprojekti jaoks, mida kasutavad teised neist sõltuvad projektid.
Näide: Kaaluge veebirakendust koos tuumteegiga, kasutajaliidese teegiga ja API klienditeegiga. Iga teek võib olla eraldi projekt oma tsconfig.json-iga. Seejärel saab peamine rakendusprojekt viidata nendele teekidele, võimaldades TypeScriptil neid iseseisvalt ja paralleelselt ehitada.
3. Moodulite lahendamise strateegiad
TypeScripti moodulite lahendamise strateegia määrab, kuidas kompilaator leiab ja lahendab moodulisõltuvused. Vaikimisi strateegia, classic, võib olla ebaefektiivne, eriti suurtes projektides. Üleminek node moodulite lahendamise strateegiale võib oluliselt parandada kompileerimiskiirust.
node moodulite lahendamise strateegia kasutamiseks seadke oma tsconfig.json failis valik moduleResolution väärtusele node:
{
"compilerOptions": {
"moduleResolution": "node"
}
}
node moodulite lahendamise strateegia jäljendab Node.js-i moodulite lahendamise algoritmi, mis on üldiselt tõhusam ja ennustatavam.
Lisaks võib `baseUrl` ja `paths` kompilaatori valikute õige kasutamine oluliselt kiirendada moodulite lahendamist. `baseUrl` määrab baaskataloogi mitte-absoluutsete moodulinimede lahendamiseks. `paths` võimaldab luua mooduliteede jaoks aliaseid.
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@core/*": ["src/core/*"],
"@ui/*": ["src/ui/*"]
}
}
}
Näide: Projektil võivad olla sügavalt pesastatud moodulikataloogid. Kasutades baseUrl ja paths saab vältida pikki suhtelisi teid (nt ../../../../utils/helpers) ja muuta moodulite lahendamise kiiremaks.
4. Sihipärane kompileerimine
Selle asemel, et kompileerida kogu projekt iga kord, saate sihtida kindlaid faile või katalooge. See on eriti kasulik arenduse ajal, kui töötate ainult väikese osa koodibaasiga. Kasutage `tsc` käsurida, et sihtida kindlaid faile.
tsc src/components/MyComponent.ts
See kompileerib ainult `MyComponent.ts`-i ja selle sõltuvused.
Projektiviidetega saate kompileerida üksikuid alamprojekte:
tsc -b core
See käsk kompileerib `core` projekti, mis on määratletud teie references massiivis.
5. Vähendage tüübikontrolli üldkulusid
Kuigi TypeScripti staatiline tüpiseerimine on suur eelis, võib see samuti kaasa aidata kompileerimise üldkuludele. Teatud funktsioonid, nagu keerulised geneerilised tüübid ja liittüübid, võivad olla eriti kallid tüübikontrolli teostamiseks. Kaaluge järgmisi strateegiaid:
- Kasutage selgesõnalisi tüüpe: Tüüpide selgesõnaline määratlemine võib mõnikord aidata kompilaatoril tüüpe tõhusamalt tuletada.
- Vältige liigset geneerikat: Geneeriliste tüüpide liigne kasutamine võib viia keerukate tüübijäreldusteni. Kaaluge võimaluse korral spetsiifilisemate tüüpide kasutamist.
- Lihtsustage liittüüpe: Suuri liittüüpe võib olla kallis kontrollida. Kaaluge diskrimineeritud liittüüpide või muude tehnikate kasutamist tüübidefinitsioonide lihtsustamiseks.
- Kasutage `any`-t (ettevaatusega): Kuigi üldiselt ei soovitata, võib `any`-t kasutada tüübikontrolli möödaminekuks spetsiifilistes olukordades, kus jõudlus on kriitiline ja tüübiohutus on vähem oluline. Kuid kasutage seda säästlikult, kuna see nullib TypeScripti kasutamise eesmärgi.
- `--noImplicitAny`: Selle lipu seadmine väärtusele `true` failis `tsconfig.json` sunnib teid tüüpe selgesõnaliselt annoteerima, mis võib aidata kompilaatorit tüübijäreldustega.
Näide: Selle asemel, et kasutada geneerilist tüüpi nagu Array<T>, kus T võib olla mis tahes, kaaluge spetsiifilisema tüübi nagu Array<string> või Array<number> kasutamist, kui on teada, et massiiv sisaldab ainult stringe või numbreid.
6. Kompilaatori valikute optimeerimine
Mitu kompilaatori valikut failis tsconfig.json võivad mõjutada kompileerimiskiirust. Kaaluge nende valikute kohandamist jõudluse optimeerimiseks:
- `target`: Valige JavaScripti sihtversioon, mis ühildub teie käituskeskkonnaga. Vanemate versioonide (nt
ES5) sihtimine võib nõuda rohkem koodi transformatsioone, suurendades kompileerimisaega. Uuemate versioonide (nt `ES2020`, `ESNext`) sihtimine võib anda kiirema kompileerimise. - `module`: Määrab mooduli koodi genereerimise stiili (nt
commonjs,esnext,amd). `esnext` on sageli kiirem kaasaegsete bundlerite jaoks. - `sourceMap`: Keelake lähtekaardi genereerimine tootmise ehitustes, et vähendada kompileerimisaega ja väljundi suurust. Seadke
sourceMapväärtuselefalseoma tootmisetsconfig.jsonfailis. - `declaration`: Lubage deklaratsioonifailide genereerimine (
.d.ts) ainult vajadusel. Keelake see arenduse ehitustes, kui te ei pea deklaratsioonifaile genereerima. - `removeComments`: Kommentaaride eemaldamine kompileerimise ajal võib veidi parandada ehitusaega ja vähendada väljundi suurust. Seadke
removeCommentsväärtuseletrue. - `importHelpers`: Abiteegi (nt `tslib`) kasutamine väldib abifunktsioonide süstimist igasse moodulisse, mis võib vähendada koodi suurust ja kompileerimisaega. Seadke `importHelpers` väärtusele `true` ja installige `tslib`.
- `isolatedModules`: Kui kasutate tööriista nagu Babel transpileerimiseks *enne* TypeScripti, siis selle lipu seadmine väärtusele `true` sunnib iga faili kompileerima eraldi moodulina. See võib mõnes stsenaariumis aidata kiiremate ehitustega.
Näide: Kaasaegse veebirakenduse jaoks, mis on suunatud uusimatele brauseritele, võiksite kasutada "target": "ESNext" ja "module": "esnext".
7. Kasutage ehitustööriistu ja bundlereid
Tööriistad nagu Webpack, Rollup ja Parcel võivad oluliselt parandada TypeScripti ehitusjõudlust. Need tööriistad kasutavad mitmesuguseid optimeerimistehnikaid, näiteks:
- Tree Shaking: Kasutamata koodi eemaldamine väljundi suuruse vähendamiseks.
- Koodi tükeldamine: Rakenduse jagamine väiksemateks osadeks, mida saab nõudmisel laadida.
- Puhverdamine: Ehitustulemuste puhverdamine tarbetu kompileerimise vältimiseks.
- Paralleelimine: Ehitustööde paralleelne käivitamine mitme CPU tuuma ära kasutamiseks.
TypeScripti integreerimisel ehitustööriistadega kaaluge spetsiaalselt TypeScripti jaoks mõeldud pluginate ja laadurite kasutamist, näiteks ts-loader või esbuild-loader Webpacki jaoks, või Parcelis sisseehitatud TypeScripti tuge. Need tööriistad pakuvad sageli täiendavaid optimeerimisvõimalusi ja integreerimist teiste ehitustööriistadega.
Näide: Webpacki kasutamine koos ts-loader'iga ja puhverdamise lubamine võib oluliselt vähendada suurte veebirakenduste ehitusaegu. Algne ehitus võib võtta kauem aega, kuid järgnevad ehitused on puhverdamise tõttu palju kiiremad.
8. Kasutage kiiremaid transpileerijaid/kontrollijaid
Ametlik `tsc` ei ole alati kiireim variant. Kaaluge alternatiive, nagu:
- esbuild: Väga kiire JavaScripti ja TypeScripti bundler ning transpileerija, kirjutatud Go keeles. See võib transpileerimisel olla märkimisväärselt kiirem kui `tsc`, kuigi see ei pruugi pakkuda sama ranget tüübikontrolli taset.
- swc: Teine Rusti-põhine tööriist, mis on uskumatult kiire nii transpileerimiseks kui ka bundlinguks.
- ts-patch + @typescript-eslint/typescript-estree: Kui teie projekt sõltub suuresti ESLintist ja `@typescript-eslintist`, võib see kombinatsioon sageli kiirendada teie linting-protsessi, paigates TypeScripti kasutama parema jõudlusega AST-d.
Sageli on parim lähenemine kombinatsiooni kasutamine: Kasutage `tsc`-d tüübikontrolliks eraldi protsessis (või oma IDE-s) ja seejärel `esbuild`-i või `swc`-d tegeliku transpileerimise ja bundlingu jaoks.
9. Jälgige ja profileerige kompileerimiskiirust
Jälgige ja profileerige regulaarselt oma TypeScripti kompileerimiskiirust, et tuvastada kitsaskohad ja jälgida oma optimeerimispüüdluste tõhusust. Kasutage tööriistu, nagu --diagnostics lipp `tsc`-s, et saada üksikasjalikku teavet kompileerimisaegade kohta.
tsc --diagnostics
See väljastab teavet kompileerimisprotsessi erinevates etappides kulutatud aja kohta, näiteks parsingu, tüübikontrolli ja koodi genereerimise kohta. Saate seda teavet kasutada selleks, et tuvastada valdkonnad, kus optimeerimispüüdlustel on kõige tõenäolisemalt märkimisväärne mõju.
Näide: Kui diagnostikaaruanne näitab, et tüübikontroll võtab märkimisväärselt aega, võiksite keskenduda tüübidefinitsioonide lihtsustamisele või keerukate geneeriliste tüüpide kasutamise vähendamisele.
10. Optimeerige oma IDE ja redaktor
Teie IDE või redaktor võib samuti mõjutada näivat jõudlust. Veenduge, et kasutate oma IDE ja TypeScripti pluginate uusimaid versioone. Konfigureerige oma IDE nii, et see kasutaks projekti TypeScripti versiooni, mitte globaalset versiooni. Kaaluge automaatse tüübikontrolli või koodi automaatse täitmise funktsioonide keelamist, kui need aeglustavad teie töövoogu.
Kokkuvõte
TypeScripti kompileerimiskiiruse optimeerimine on oluline tootliku ja tõhusa arendustöövoo säilitamiseks. Rakendades selles artiklis kirjeldatud tehnikaid, saate oluliselt vähendada ehitusaegu, parandada arendajate rahulolu ja kiirendada kvaliteetse tarkvara tarnimist. Ärge unustage pidevalt jälgida ja profileerida oma kompileerimiskiirust, et tuvastada valdkonnad edasiseks optimeerimiseks ja tagada, et teie pingutustel on soovitud mõju. Parim optimeerimisstrateegia on sageli mitme tehnika kombinatsioon, mis on kohandatud teie konkreetsele projektile ja arenduskeskkonnale.